#ifndef custom_string_h
#define custom_string_h

#include "mesinkata.h"

string StrCat(string s1 , string s2);
/* Menggabungkan 2 string */

//--------------
//  RELASIONAL
//--------------
boolean IsNumber(char C);
/* true jika C adalah bilangan */

boolean IsStringEq(string k1 , string k2);
/* Mengecek kesamaan dari 2 buah string */

boolean IsStringLt(string s1 , string s2);
/* Mengecek apakah s1 lebih kecil daripada s2 secara alfabetikal 
misal : ab < abc */

boolean IsStringGt(string s1 , string s2);
/* Mengecek apakah s1 lebih besar daripada s2 secara alfabetikal 
misal : az > abc */

int IsStringEqSpec(string s1 , string s2);
/* Mengecek kesamaan dari 2 buah string dengan aturan :
	1. 	pengecekan string dilakukan secara case insensitive
	2. 	mengembalikan nilai 1 jika string sama persis,
		0 jika sangat beda
	3.	,dan 2 jika string hanya berbeda sedikit (butuh algorima LCS (Longest Common Subsequence))
			misal 
				IsStringEqSpec("delete","drlete") akan menghasilkan 2
				IsStringEqSpec("indonesia","indonesa") akan menghasilkan 2
	// catatan : poin 3 susah, bisa dilakukan belakangan
	*/


int maxx (int a, int b); 
/* menghasilkan nilai maksimum dari a dan b */


int LCS (string s1, string s2) ;
/*  mengeluarkan panjang longest common subsequence dari string s1 dan string s2 */

//--------------
//  Pengecekan Tambahan Tipe String
//--------------

boolean IsStringDir (string S);
/* mengecek apakah string adalah suatu direktori atau bukan 
direktori diawali dengan '/' di linux, 'X:\' di windows  */

boolean IsStringFormula (string S);
/* mengecek apakah string adalah suatu formula atau bukan 
formula selalu diawali dengan = */

boolean IsStringInteger (string S);
/* mengecek apakah string dapat diubah menjadi suatu Integer atau tidak 
Integer selalu berisi angka (1-9) dengan nilai diantara -2 milyar dan 2 milyar inklusif */

boolean IsStringDouble (string S);
/* mengecek apakah string dapat diubah menjadi bilangan double atau tidak 
double selalu berisi angka (1-9) dengan nilai diantara -2 milyar dan 2 milyar inklusif dan
tepat 1 buah titik*/

boolean IsStringBoolean (string S);
/* mengecek apakah string dapat diubah menjadi boolean atau tidak 
boolean hanya berisi 2 macam data true atau false (case_insensitive) atau tipe data integer */

boolean IsStringDate (string S);
/* mengecek apakah string dapat diubah menjadi tipe bentukan date yang valid atau tidak 
tipe date yang valid selalu berformat dd-mm-yy , dan merupakan tanggal yang valid*/

boolean IsStringTime (string S);
/* mengecek apakah string dapat diubah menjadi tipe bentukan time yang valid atau tidak 
tipe time yang valid selalu berformat hh:mm:ss , dan merupakan waktu yang valid 
dalam format 24 jam 00:00:00-23:59:59 */


//--------------
// KONVERTER
//--------------

// Konversi string <-->  integer
int StringToInt(string s);
string IntToString(long x);

// Konversi array of char <--> string
char *StringToChar(string s);
string CharToString(char *c);

// Konversi string <--> real
double StringToDouble(string s);
string DoubleToString(double x);

// Konversi string <--> boolean
boolean StringToBool(string s);
string BoolToString(boolean x);

//--------------
//  OPERATOR
//--------------

string GetSubString(string s, int start, int length);
/* Mengambil substring dari string s dari posisi start sepanjang length */

string UpperCase(string s);
/* Mengembalikan string s dengan setiap elemen string s adalah uppercase */

string LowerCase(string s);
/* Mengembalikan string s dengan setiap elemen string s adalah lowercase */

string TrimWhiteSpace(string s);
/* Menghilangkan semua spasi dari string s */

string DeleteSubString(string s , int pos , int length);
/* menghapus substring dari string s dari posisi s sepanjang length */

#endif


